home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / saru / g1000.c < prev    next >
C/C++ Source or Header  |  1999-06-15  |  19KB  |  1,104 lines

  1. /*
  2. CD-DA直接もぐらたたき?
  3. by 電魔団\shoryu 1999 for G7
  4. */
  5.  
  6. #include    <stdio.h>
  7. #include    <stdlib.h>
  8. #include    <string.h>
  9. #include    <basic0.h>
  10. #include    <iocslib.h>
  11. #include    <doslib.h>
  12.  
  13.  
  14. extern    char    PCM_1005_001[],        //ウキやっつけ音
  15.         PCM_1005_003[],        //GAMEOVER音
  16.         PCM_AXE0004[];        //からぶり音
  17.  
  18. extern    int    PCMSIZE_1005_001,PCMSIZE_1005_003,PCMSIZE_AXE0004;    //サイズ
  19.  
  20. typedef    struct    {
  21.     int    start_addr;        //アブソリュートCD-ROM開始アドレス
  22.     int    track_len;        //アブソリュートトラック長
  23. } TRACK;
  24.  
  25.  
  26. //CD本来のTOC情報
  27. TRACK    Track[100];            //[0]は全体、[普通に曲番号]が入る
  28.                     //インデックスの曲番号に「0xaa」てのがあるので注意
  29.  
  30. /*
  31. unsigned char    Toc[804]={ 0x43,0,    //TOC読み込みコマンド&データバッファ
  32.         0,0,0,0,
  33.         2,0x3,0x24,0};
  34. */
  35.  
  36. unsigned short    Toc[804/2]={ 0x4300,    //TOC読み込みコマンド&データバッファ
  37.         0,0,
  38.         0x0203,0x2400};
  39.  
  40.  
  41. //ウキ音(L000+R000+L050+R050+)のvTRACK
  42. //CD-DAアブショリュートアドレス、アブソリュート長
  43. #define        VTRACKS        (18*2)
  44. TRACK    vTrack[VTRACKS]={            //?=LorR
  45.     {0,74},        {75,74},        //?000
  46.     {150,74},    {225,74},        //?050
  47.     {300,74},    {375,74},        //?100
  48.     {450,74},    {525,74},        //?150
  49.     {600,74},    {675,74},        //?200
  50.     {750,74},    {825,74},        //?250
  51.     {900,74},    {975,74},        //?300
  52.     {1050,74},    {1125,74},        //?350
  53.     {1200,74},    {1275,74},        //?400
  54.     {1350,74},    {1425,74},        //?450
  55.     {1500,74},    {1575,74},        //?500
  56.     {1650,74},    {1725,74},        //?550
  57.     {1800,74},    {1875,74},        //?600
  58.     {1950,74},    {2025,74},        //?650
  59.     {2100,74},    {2175,74},        //?700
  60.     {2250,74},    {2325,74},        //?750
  61.     {2400,74},    {2475,74},        //?800
  62.     {2550,74},    {2625,74}        //?850
  63. };
  64.  
  65. char    *Guide[VTRACKS]={
  66. //    "ASDF JKL;",
  67.     "   F J   ",    //L000
  68.     "   F J   ",    //R000
  69.  
  70.     "   F     ",    //L050
  71.     "     J   ",    //R050
  72.     "   F     ",    //L100
  73.     "     J   ",    //R100
  74.  
  75.     "  DF     ",    //L150
  76.     "     JK  ",    //R150
  77.     "  DF     ",    //L200
  78.     "     JK  ",    //R200
  79.  
  80.     "  D      ",    //L250
  81.     "      K  ",    //R250
  82.     "  D      ",    //L300
  83.     "      K  ",    //R300
  84.     "  D      ",    //L350
  85.     "      K  ",    //R350
  86.  
  87.     " SD      ",    //L400
  88.     "      KL ",    //R400
  89.     " SD      ",    //L450
  90.     "      KL ",    //R450
  91.  
  92.     " S       ",    //L500
  93.     "       L ",    //R500
  94.     " S       ",    //L550
  95.     "       L ",    //R550
  96.     " S       ",    //L600
  97.     "       L ",    //R600
  98.  
  99.     "AS       ",    //L650
  100.     "       L;",    //R650
  101.     "AS       ",    //L700
  102.     "       L;",    //R700
  103.  
  104.     "A        ",    //L750
  105.     "        ;",    //R750
  106.     "A        ",    //L800
  107.     "        ;",    //R800
  108.     "A        ",    //L850
  109.     "        ;"    //R850
  110. };
  111.  
  112.  
  113. char    *DirInfo[VTRACKS]={
  114.     "   ← 00度     ",
  115.     "     00度 →   ",
  116.     "   ← 05度     ",
  117.     "     05度 →   ",
  118.     "   ← 10度     ",
  119.     "     10度 →   ",
  120.     "   ← 15度     ",
  121.     "     15度 →   ",
  122.  
  123.     "  ←← 20度     ",
  124.     "     20度 →→  ",
  125.     "  ←← 25度     ",
  126.     "     25度 →→  ",
  127.     "  ←← 30度     ",
  128.     "     30度 →→  ",
  129.     "  ←← 35度     ",
  130.     "     35度 →→  ",
  131.     "  ←← 40度     ",
  132.     "     40度 →→  ",
  133.  
  134.     " ←←← 45度     ",
  135.     "     45度 →→→ ",
  136.     " ←←← 50度     ",
  137.     "     50度 →→→ ",
  138.     " ←←← 55度     ",
  139.     "     55度 →→→ ",
  140.     " ←←← 60度     ",
  141.     "     60度 →→→ ",
  142.     " ←←← 65度     ",
  143.     "     65度 →→→ ",
  144.  
  145.     "←←←← 70度     ",
  146.     "     70度 →→→→",
  147.     "←←←← 75度     ",
  148.     "     75度 →→→→",
  149.     "←←←← 80度     ",
  150.     "     80度 →→→→",
  151.     "←←←← 85度     ",
  152.     "     85度 →→→→"
  153.  
  154. };
  155.  
  156.  
  157.  
  158. typedef    struct    {
  159.     int    kg,kd;            //トリガとなるキーグループとキーデータ(ビット番号にあらず)
  160.     int    start_addr;        //アブソリュートCD-ROM開始アドレス
  161.     int    track_len;        //アブソリュートトラック長
  162. } TRACKOFF;
  163.  
  164. //バラバラ再生用トラックオフセット
  165. #define        TRACKOFFS    (8)
  166. TRACKOFF    Troff[TRACKOFFS]={
  167. //    キー        開始オフセット    再生時間
  168.     {3,0x40,     1000,        50},    //'A'
  169.     {3,0x80,     1075,        50},    //'S'
  170.     {4,0x01,     1150,        50},    //'D'
  171.     {4,0x02,     1225,        50},    //'F'
  172.  
  173.     {4,0x10,     1300,        50},    //'J'
  174.     {4,0x20,     1375,        50},    //'K'
  175.     {4,0x40,     1450,        50},    //'L'
  176.     {4,0x80,     1525,        50}    //';'
  177. };
  178.  
  179.  
  180.  
  181.  
  182.  
  183. typedef    struct    {
  184.     int    kb[0x10];    //キー情報
  185.  
  186.     int    anskey;        //ASDFJKL;=12345678/入力無し=0
  187. } DEVICE;
  188.  
  189. DEVICE    Dev,oDev;
  190. int    prohiTime;    //ASDF入力禁止カウンタ
  191.  
  192.  
  193. //ASDFJKL;に対応するvTrackの番号
  194. int    HitTable_A[]= {34,32,30,28,26,-1};        //A
  195. int    HitTable_S[]= {28,26,24,22,20,18,16,-1};    //S
  196. int    HitTable_D[]= {18,16,14,12,10, 8, 6,-1};    //D
  197. int    HitTable_F[]= { 8, 6, 4, 2, 0, 1,-1};        //F
  198.  
  199. int    HitTable_J[]= { 0, 1, 3, 5, 7, 9,-1};        //J
  200. int    HitTable_K[]= { 7, 9,11,13,15,17,19,-1};    //K
  201. int    HitTable_L[]= {17,19,21,23,25,27,29,-1};    //L
  202. int    HitTable_SC[]={27,29,31,33,35,-1};        //;
  203.  
  204. int    *HitTable[8+1]={
  205.     NULL,                        //NULL
  206.     HitTable_A,HitTable_S,HitTable_D,HitTable_F,
  207.     HitTable_J,HitTable_K,HitTable_L,HitTable_SC
  208. };
  209.  
  210.  
  211. #define        TRUE    (0)
  212. #define        FALSE    (-1)
  213. int    exit_flag=FALSE;
  214.  
  215. int    DB=0;            //デバッグ情報1=ON/0=OFF
  216. int    HINT=0;            //
  217.  
  218. //システム用
  219. int    SCSI_ID;        //CD-ROMドライブのSCSI-ID
  220. int    CDDA_TRACK;        //ウキのデータが入ったCDDAトラック番号
  221.  
  222. int    PlayStartTime;        //今鳴っているトラックを演奏開始した時間
  223. int    PlayNumber;        //      トラック番号
  224. int    AnswerTime;        //回答制限時間
  225.  
  226. int    Score;            //得点
  227. int    MissCount;        //ミスカウント
  228.  
  229. int    gameCondition;        //現在のゲームコンディション
  230.  
  231. int    gameLevel;        //ゲームレベル
  232.  
  233. int    AnswerTimeTBL[]={500,400,150,300,250,100};    // 1/100タイマ
  234. int    prohiTimeTBL[]={90,90,25,50,40,25};        // V-sync
  235.  
  236.  
  237. enum    GCND    {
  238.     ALL_INIT,
  239.  
  240.     DEMO_INIT,
  241.     DEMO,
  242.  
  243.     COUNTDOWN_INIT,
  244.     COUNTDOWN,
  245.  
  246.     PLAY_TRACK,
  247.     WAIT_ANSWER,
  248.     GOOD_ANSWER_INIT,
  249.     GOOD_ANSWER,
  250.     BAD_ANSWER_INIT,
  251.     BAD_ANSWER,
  252.     TIMEOUT_ANSWER_INIT,
  253.     TIMEOUT_ANSWER,
  254.     WAIT_NEXT,
  255.     
  256.     LEVEL_CONTROL,
  257.     
  258.     GAMEOVER_INIT,
  259.     GAMEOVER
  260. };
  261.  
  262.  
  263. unsigned short    TPALET0;        //画面フラッシュ用:通常=0
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271. int    HiScore;
  272. int    totalCnt,    hitCnt,        outCnt;
  273. int    karaburiCnt;
  274.  
  275.  
  276.  
  277.  
  278. int    PrintTitle()
  279. {
  280.     locate(0,0);    printf(" ←↑さるばとる↑→ ");
  281.  
  282.     return(0);
  283. }
  284.  
  285.  
  286. int    PrintInfo()
  287. {
  288.     locate(0,0);    printf("おさるの出現数:%02d",totalCnt);
  289.     locate(0,1);    printf("やった数   :%02d",hitCnt);
  290.     locate(0,2);    printf("やられた数  :%02d",outCnt);
  291.  
  292.     return(0);
  293. }
  294.  
  295.  
  296. int    PrintSubInfo(fnc)
  297. int    fnc;    //0=消去・1=表示
  298. {
  299.     int    rt;
  300.  
  301.     locate(0,3);
  302.     switch(fnc){
  303.         case 0:
  304.             printf("   ");
  305.         break;
  306.         
  307.         case 1:
  308.             if( prohiTime ){
  309.                 printf("%03d",prohiTime-1);
  310.             }
  311.             else{
  312.                 rt=(PlayStartTime+AnswerTime)-ONTIME();
  313.                 printf("%03d",rt);
  314.             }
  315.         break;
  316.     }
  317.  
  318.     return(0);
  319. }
  320.  
  321.  
  322. int    PrintAns()
  323. {
  324.     locate(0+7,4);    printf(Guide[PlayNumber]);
  325.  
  326.     return(0);
  327. }
  328.  
  329.  
  330. int    PrintDemo(fn)
  331. int    fn;
  332. {
  333.     char    *mes[2]={
  334.         "             ",
  335.         "DEMONSTRATION"
  336.     };
  337.     locate(0+4,5);    printf(mes[fn]);
  338.  
  339.     return(0);
  340. }
  341.  
  342.  
  343. int    PrintPush(fn)
  344. int    fn;
  345. {
  346.     char    *mes[2]={
  347.         "             ",
  348.         "PUSH ASDF-key"
  349.     };
  350.     locate(0+4,5);    printf(mes[fn]);
  351.  
  352.     return(0);
  353. }
  354.  
  355.  
  356. int    PrintDirInfo()
  357. {
  358.     locate(0,6);    printf(DirInfo[PlayNumber]);
  359.  
  360.     return(0);
  361. }
  362.  
  363.  
  364.  
  365.  
  366.  
  367. int    DevMan()
  368. {
  369.     int    kg;
  370.             //    A    S    D    F    J    K    L    ;
  371.     int    akg[9]={0,    3,   3,   4,   4,    4,   4,   4,   4},
  372.         akb[9]={0,    0x40,0x80,0x01,0x02,    0x10,0x20,0x40,0x80};
  373.  
  374.     oDev=Dev;
  375.     for( kg=0; kg<0x10; kg++ ){
  376.         Dev.kb[kg]=BITSNS(kg);
  377.     }
  378.  
  379.     //ASDFJKL;キー判定
  380.     Dev.anskey=0;
  381.     if( prohiTime==0 ){
  382.         for( kg=1;kg<=8;kg++ ){
  383.             if( Dev.kb[akg[kg]]==akb[kg] && oDev.kb[akg[kg]]==0 ){
  384.                 Dev.anskey=kg;
  385.             }
  386.         }
  387.     }
  388.     else{
  389.         prohiTime--;
  390.     }
  391.  
  392.     
  393.     return(0);
  394. }
  395.  
  396.  
  397.  
  398.  
  399.  
  400. int    SyncMan()
  401. {
  402.     int    ssp;
  403.     volatile    unsigned char    *gpip=(unsigned char *)0xE88001;
  404.     unsigned short    *tpal0=(unsigned short *)0xe82200;
  405.     
  406.     ssp=B_SUPER(0);
  407.     if( !((*gpip)&0x10) ){
  408.         while( !((*gpip)&0x10) );
  409.     }
  410.     while( (*gpip)&0x10 );
  411.  
  412.     *tpal0=TPALET0;
  413.     
  414.     B_SUPER(ssp);
  415.  
  416.     return(0);
  417. }
  418.  
  419.  
  420.  
  421.  
  422.  
  423. int    TOCRead(scsi_id)
  424. int    scsi_id;
  425. {
  426.     unsigned char    buf[256];    //@@かなり適当
  427.     unsigned char    *toc;
  428.     int    retry;
  429.     int    st;
  430.     int    res=0;
  431.  
  432.     
  433.     //使えるかどうかチェック    inquiry
  434.     //メディアチェック        testunit
  435.     if( S_SELECT(scsi_id)!=0 ){            //SCSI-ID
  436.         res=-1;
  437.         goto quick_exit;
  438.     }
  439.     retry=0;
  440.     while( (st=S_CMDOUT(10,Toc))!=0 ){retry++;}    //コマンド発行
  441. printf("cmd-out:%d\n",retry);
  442. printf("ST:%x\n",st);
  443.  
  444.     retry=0;
  445.     while( (st=S_DATAIN(sizeof(Toc),Toc))!=0 ){
  446.         printf("<%d>",st);
  447.         retry++;
  448.  
  449.         /*
  450.             S_DATAIN()の戻り値でなく、
  451.             入力バッファの中身を見て判断するしかないのか?
  452.         */
  453.         if( Toc[0]!=0x43 ){
  454.             printf("バッファ更新\n");
  455.             break;
  456.         }
  457.         if( retry==15 ){
  458.             printf("S_DATAINでエラー\n");
  459.             res=-1;
  460.             goto quick_exit;
  461.             break;
  462.         }
  463.     }
  464. printf("DT-IN retry=%d\n",retry);
  465. printf("ST:%x\n",st);
  466.  
  467.     retry=0;
  468.     while( (st=S_STSIN(buf))!=0 ){        //ステータスインフェーズ
  469.         retry++;
  470.         if( retry==15 ){
  471.             printf("S_STSINでエラー\n");
  472.             res=-2;
  473.             goto quick_exit;
  474.             break;
  475.         }
  476.     }
  477. printf("ST-IN retry=%d\n",retry);
  478. printf("ST:%x\n",st);
  479.  
  480.     
  481.     S_MSGIN(buf);        //メッセージインフェーズ
  482.  
  483. {
  484.     int    i,n,tr;
  485.     int    toc2,toc3;
  486.  
  487.     toc=(unsigned char *)Toc;    //@@おのれ
  488.  
  489.     toc2=*(toc+2);
  490.     toc3=*(toc+3);
  491.     printf("TOCデータ長:%02X%02X\n",*(toc+0),*(toc+1));
  492.     printf("先頭トラック番号:%02X\n",*(toc+2));
  493.     printf("最終トラック番号:%02X\n",*(toc+3));
  494.     
  495.     tr=0;    Track[tr].start_addr=0;            //全体開始
  496.     tr=1;    Track[tr].start_addr=0;
  497.     for( n=0,tr=2,i=toc2;i<=toc3;n++,tr++,i++ ){
  498.         int    _st,_ab;
  499.         Track[tr].start_addr=*(int *)(toc+(4+n*8+4));
  500.         _st=*(toc+(4+n*8+2));
  501.         _ab=(*(int *)(toc+(4+n*8+4)));
  502. printf("トラック番号:%02x \n",_st);
  503. printf("アブソリュートCD-ROM開始アドレス:%08X\n",_ab);
  504.     }
  505. //**/getch();
  506.     Track[0].track_len=Track[tr-1].start_addr;    //全体終了
  507.  
  508.     for( tr=1,i=toc[2];i<=toc[3];tr++,i++ ){
  509.         Track[tr].track_len=Track[tr+1].start_addr-Track[tr].start_addr-1;
  510.     }
  511.  
  512.     for( n=0,i=toc[2];i<=toc[3];n++,i++ ){
  513. printf("%d:%x-%x\n",n,Track[n].start_addr,Track[n].track_len);
  514.     }
  515. }
  516.  
  517. quick_exit:
  518.     return(res);
  519.  
  520. }
  521.  
  522.  
  523.  
  524.  
  525. int    AbsPlay(scsi_id,start,len)
  526. int    scsi_id,start,len;        //アブショリュート値で指定
  527. {
  528.     //p.246
  529. //                    start        end
  530.     unsigned char    cmd[]={ 0xa5,0,    0,0,0,0,    0,0,0,0,    0,0};
  531.     unsigned char    buf[256];    //@@かなり適当
  532.  
  533.     *(int *)(&cmd[2])=start;
  534.     *(int *)(&cmd[6])=len;
  535.     
  536.     //使えるかどうかチェック    inquiry
  537.     //メディアチェック    testunit
  538.     S_SELECT(scsi_id);    //SCSI-ID
  539.     S_CMDOUT(12,cmd);    //再生コマンド発行
  540.     S_STSIN(buf);        //ステータスインフェーズ
  541.     S_MSGIN(buf);        //メッセージインフェーズ
  542.  
  543.     return(0);
  544. }
  545.  
  546.  
  547.  
  548.  
  549. /*
  550.     指定したvTrackの再生
  551. */
  552. int    PlayVTrack(tn)
  553. int    tn;
  554. {
  555.     int    st,len;
  556.  
  557.     st =Track[CDDA_TRACK].start_addr+vTrack[tn].start_addr;
  558.     len=vTrack[tn].track_len;
  559.     AbsPlay( SCSI_ID, st, len );
  560.  
  561.     return(0);
  562. }
  563.  
  564.  
  565.  
  566.  
  567.  
  568. int    Idle()
  569. {
  570. //    int    k;
  571.  
  572.  
  573.     if( Dev.kb[0]==0x02 ){        //ESCキー
  574.         exit_flag=TRUE;
  575.     }
  576.     
  577.     return(0);
  578. }
  579.  
  580.  
  581.  
  582. int    Term(mes)
  583. char    *mes;
  584. {
  585.     OS_CURON();
  586.     cls();
  587.     KFLUSHIO(0xff);
  588.     printf("%s\n",mes);
  589.  
  590.     return(0);
  591. }
  592.  
  593.  
  594.  
  595. int    Init(argc,argv)
  596. int    argc;
  597. char    *argv[];
  598. {
  599.     int    res=0;
  600.  
  601. //@@デフォルト
  602.     SCSI_ID=6;
  603.     CDDA_TRACK=2;
  604.  
  605.     {    //環境変数CDROMが設定されているか?
  606.         char    *p,buf[256];
  607.         p=getenv("CDROM");
  608.         if( p!=NULL ){
  609.             strcpy(buf,p);
  610.             SCSI_ID=atoi(buf);
  611.             //SCSI_ID=0はありえるけど
  612.             if( SCSI_ID==0 && buf[0]!='0' ){
  613.                 res=-1;
  614.                 goto quick_exit;
  615.             }
  616.         }
  617.     }
  618.     
  619.     if( argc!=1 ){    //トラック番号指定あるか
  620.         CDDA_TRACK=atoi(argv[1]);
  621.         if( CDDA_TRACK==0 ){
  622.             res=-1;
  623.             goto quick_exit;
  624.         }
  625.     }
  626.     
  627.     //デバク等
  628.     if( argc==3 ){
  629.         switch( argv[2][0] ){
  630.             case 'h':case 'H':
  631.                 HINT=1;
  632.             break;
  633.             case 'd':case 'D':
  634.                 DB=1;
  635.             break;
  636.             case '*':
  637.                 HINT=1;
  638.                 DB=1;
  639.             break;
  640.         }
  641.     }
  642.     
  643.     
  644.     srand(ONTIME());
  645.     OS_CUROF();
  646.     gameCondition=ALL_INIT;
  647.     
  648.     res=TOCRead(SCSI_ID);
  649.  
  650. //printf("ASDF JKL;で当てよう:ESCキーで終わり");
  651.  
  652. quick_exit:
  653.     return(res);
  654. }
  655.  
  656.  
  657.  
  658. int    Demo__Number;
  659. int    Demo__local_counter;
  660. int    Demo001()            //順番に鳴らす
  661. {
  662. #define    DEMOPLAY_INTV    (150)
  663.  
  664.     if( Dev.anskey!=0 ){
  665.         gameCondition=COUNTDOWN_INIT;
  666.     }
  667.  
  668.     if( (Demo__local_counter%DEMOPLAY_INTV)==0 ){
  669.         PlayNumber=Demo__local_counter/DEMOPLAY_INTV;
  670.         PrintAns();
  671.         PrintDirInfo();
  672.         PlayVTrack(PlayNumber);
  673.         goto quick_exit;
  674.     }
  675.  
  676.     if( (Demo__local_counter%60)==1 ){
  677.         PrintDemo(1);
  678.         goto quick_exit;
  679.     }
  680.     if( (Demo__local_counter%60)==31 ){
  681.         PrintDemo(0);
  682.         goto quick_exit;
  683.     }
  684.     
  685.     if( Demo__local_counter==(DEMOPLAY_INTV*(VTRACKS-1)-1) ){
  686.         gameCondition=DEMO_INIT;
  687.         goto quick_exit;
  688.     }
  689.  
  690. quick_exit:
  691.     Demo__local_counter++;
  692.     return(0);
  693. }
  694.  
  695. int    Demo002()            //バラバラにはやく鳴らす
  696. {
  697.     if( Dev.anskey!=0 ){
  698.         gameCondition=COUNTDOWN_INIT;
  699.     }
  700.  
  701.     if( (Demo__local_counter%(DEMOPLAY_INTV*3/4))==0 ){
  702.         PlayNumber=rand()%VTRACKS;
  703.         PrintAns();
  704.         PrintDirInfo();
  705.         PlayVTrack(PlayNumber);
  706.         goto quick_exit;
  707.     }
  708.  
  709.     if( (Demo__local_counter%60)==1 ){
  710.         PrintDemo(1);
  711.         goto quick_exit;
  712.     }
  713.     if( (Demo__local_counter%60)==31 ){
  714.         PrintDemo(0);
  715.         goto quick_exit;
  716.     }
  717.     
  718.     if( Demo__local_counter==(15*60) ){
  719.         gameCondition=DEMO_INIT;
  720.         goto quick_exit;
  721.     }
  722.  
  723.     //ごくたまに、仮想デモプレーヤーが入力@@まだ
  724.     if( (rand()%15)==(rand()%8) ){
  725. //        
  726.     }
  727.  
  728.     
  729. quick_exit:
  730.     Demo__local_counter++;
  731.     return(0);
  732. }
  733.  
  734.  
  735. int    Demo003()            //しずかに
  736. {
  737.     if( Dev.anskey!=0 ){
  738.         gameCondition=COUNTDOWN_INIT;
  739.     }
  740.  
  741.     if( (Demo__local_counter%60)==1 ){
  742.         PrintPush(1);
  743.         goto quick_exit;
  744.     }
  745.     if( (Demo__local_counter%60)==31 ){
  746.         PrintPush(0);
  747.         goto quick_exit;
  748.     }
  749.     
  750.     if( Demo__local_counter==(5*60) ){
  751.         gameCondition=DEMO_INIT;
  752.         goto quick_exit;
  753.     }
  754.  
  755. quick_exit:
  756.     Demo__local_counter++;
  757.     return(0);
  758. }
  759.  
  760.  
  761.  
  762.  
  763. int    SM__ALL_INIT()
  764. {
  765. cls();
  766.     gameCondition=DEMO_INIT;
  767.  
  768.     return(0);
  769. }
  770.  
  771. int    SM__DEMO_INIT()
  772. {
  773. cls();
  774.     PrintTitle();
  775.     switch( Demo__Number ){
  776.         case 1:    Demo__Number=2;    break;
  777.         case 2:    Demo__Number=3;    break;
  778.         case 3:    Demo__Number=4;    break;
  779.         case 4:    Demo__Number=1;    break;
  780.         default:Demo__Number=4;    break;
  781.     }
  782.     Demo__local_counter=0;
  783.     gameCondition=DEMO;
  784.  
  785.     return(0);
  786. }
  787.  
  788. int    SM__DEMO()
  789. {
  790.     switch( Demo__Number ){
  791.         case 1:    Demo001();    break;
  792.         case 3:    Demo002();    break;
  793.  
  794.         case 2:
  795.         case 4:    Demo003();    break;
  796.     }
  797. //    gameCondition=COUNTDOWN_INIT;
  798.  
  799.     return(0);
  800. }
  801.  
  802. int    SM__COUNTDOWN_INIT()
  803. {
  804.     totalCnt=0;
  805.     hitCnt=0;
  806.     outCnt=0;
  807.     karaburiCnt=0;
  808.     
  809.     gameLevel=0;
  810. cls();
  811. printf("用意:3秒後開始\x0d");
  812.     gameCondition=COUNTDOWN;
  813. AnswerTime=180;
  814. PlayStartTime=ONTIME();
  815.  
  816.     return(0);
  817. }
  818.  
  819. int    SM__COUNTDOWN()
  820. {
  821.     int    nt;
  822.     nt=ONTIME();
  823.     if( (PlayStartTime+AnswerTime)<=nt ){
  824. //printf("はじめ");
  825.         gameCondition=PLAY_TRACK;
  826.         goto quick_exit;
  827.     }
  828.  
  829. quick_exit:
  830.     return(0);
  831. }
  832.  
  833. int    SM__PLAY_TRACK()
  834. {
  835.     int    tn;        //tn
  836.  
  837.     if( TPALET0!=0 ){ TPALET0=0; }
  838.  
  839.     totalCnt++;
  840.     PrintInfo();
  841.     tn=rand()%VTRACKS;        //0~VTRACKS
  842.     PlayNumber=tn;
  843.     prohiTime=0;            //ASDF入力許可
  844.     AnswerTime=AnswerTimeTBL[gameLevel];//回答時間@@てきとー
  845. if(DB)printf("vTrack No.=%d ",tn);
  846. if(HINT)PrintAns();                //カンニング@@
  847.     PlayVTrack(tn);            //鳴らす
  848.     PlayStartTime=ONTIME();
  849.     
  850.     gameCondition=WAIT_ANSWER;
  851.  
  852.     return(0);
  853. }
  854.  
  855. int    SM__WAIT_ANSWER()
  856. {
  857.     int    nt;
  858.  
  859.     PrintSubInfo(1);    //タイマー表示
  860.  
  861.     nt=ONTIME();
  862.     if( (PlayStartTime+AnswerTime)<nt ){    //時間切れか?
  863.         gameCondition=TIMEOUT_ANSWER_INIT;
  864.         goto quick_exit;
  865.     }
  866.  
  867.     //正解チェック
  868.     if( Dev.anskey!=0 ){
  869.         int    *ht;
  870.  
  871. if(DB)printf("anskey=%d:",Dev.anskey);
  872.         ht=HitTable[Dev.anskey];
  873. if(DB)printf("addr=%x:",ht);
  874.         gameCondition=BAD_ANSWER_INIT;
  875.         while( *ht!=-1 ){
  876. if(DB)printf("%d:",*ht);
  877.             if( PlayNumber==*ht ){
  878.                 gameCondition=GOOD_ANSWER_INIT;
  879.                 break;
  880.             }
  881.             else{
  882.                 ht++;
  883.             }
  884.         }
  885.     }
  886.  
  887. quick_exit:
  888.     return(0);
  889.  
  890. }
  891.  
  892. int    SM__GOOD_ANSWER_INIT()
  893. {
  894. if(DB)printf("正解!");
  895.     ADPCMOUT(PCM_1005_001,0x0403,PCMSIZE_1005_001);
  896.     hitCnt++;
  897.     gameCondition=GOOD_ANSWER;
  898.  
  899.     return(0);
  900. }
  901.  
  902. int    SM__GOOD_ANSWER()
  903. {
  904.     gameCondition=WAIT_NEXT;
  905.  
  906.     return(0);
  907. }
  908.  
  909. int    SM__BAD_ANSWER_INIT()
  910. {
  911.     ADPCMOUT(PCM_AXE0004,0x0403,PCMSIZE_AXE0004);
  912.     karaburiCnt++;
  913.     prohiTime=prohiTimeTBL[gameLevel];        //@@入力禁止カウンタ
  914. if(DB)printf("間違い?");
  915.     gameCondition=BAD_ANSWER;
  916.  
  917.     return(0);
  918. }
  919.  
  920. int    SM__BAD_ANSWER()
  921. {
  922. //    gameCondition=WAIT_NEXT;
  923.     gameCondition=WAIT_ANSWER;
  924.  
  925.     return(0);
  926. }
  927.  
  928. int    SM__WAIT_NEXT()
  929. {
  930.     int    nt;
  931.  
  932.     PrintInfo();
  933.     PrintSubInfo(0);
  934.     nt=ONTIME();
  935.     if( (PlayStartTime+AnswerTime)<=nt ){    //次の再生時間まで待つ
  936.         gameCondition=LEVEL_CONTROL;
  937. //        gameCondition=PLAY_TRACK;
  938.         goto quick_exit;
  939.     }
  940.  
  941. quick_exit:
  942.     return(0);
  943. }
  944.  
  945. int    SM__TIMEOUT_ANSWER_INIT()
  946. {
  947.     TPALET0=0x0400;            //画面赤
  948.     outCnt++;
  949.     gameCondition=TIMEOUT_ANSWER;
  950.  
  951.     return(0);
  952. }
  953.  
  954. int    SM__TIMEOUT_ANSWER()
  955. {
  956.     gameCondition=WAIT_NEXT;
  957.  
  958.     return(0);
  959. }
  960.  
  961. int    SM__LEVEL_CONTROL()
  962. {
  963.     int    bo;
  964.  
  965.     if( totalCnt==60 ){
  966.         gameCondition=GAMEOVER_INIT;
  967.         goto quick_exit;
  968.     }
  969.  
  970. #define        CLRCHK        (5)
  971.  
  972.     if( (totalCnt%10)==0 ){        //次のレベルへ
  973.         bo=(hitCnt*10)/totalCnt;
  974.         if( bo>=CLRCHK ){
  975.             gameLevel++;    //次のレベルへ
  976.             gameCondition=PLAY_TRACK;
  977.         }
  978.         else{
  979.             gameCondition=GAMEOVER_INIT;
  980.         }
  981.     }
  982.     else{
  983.         gameCondition=PLAY_TRACK;
  984.     }
  985.  
  986. quick_exit:
  987.     return(0);
  988. }
  989.  
  990. #define        GAMEOVER_TIME    (60*10)    //10sec
  991. int    GAMEOVER__local_counter;
  992.  
  993. int    SM__GAMEOVER_INIT()
  994. {
  995.     char    *mes[7]={
  996.         NULL,
  997.         "次は頑張って",        //10
  998.         "その調子で頑張れ",    //20
  999.         "ここからが勝負",    //30
  1000.         "油断大敵…かな",    //40
  1001.         "頑張れ、もう少し",    //50
  1002.         "良く頑張りました"    //60
  1003.     };
  1004.  
  1005.     ADPCMOUT(PCM_1005_003,0x0403,PCMSIZE_1005_003);
  1006.     GAMEOVER__local_counter=0;
  1007.     if( hitCnt>HiScore ){
  1008.         HiScore=hitCnt;
  1009.     }
  1010.     printf("%s\n",mes[totalCnt/10]);
  1011.     printf("こっそり教えちゃウ。からぶり回数は%d回よん\n",karaburiCnt);
  1012.     printf("→↓GAME OVER↓←");
  1013.     gameCondition=GAMEOVER;
  1014.  
  1015.     return(0);
  1016. }
  1017.  
  1018. int    SM__GAMEOVER()
  1019. {
  1020.     GAMEOVER__local_counter++;
  1021.     if( GAMEOVER__local_counter>GAMEOVER_TIME ){
  1022.         gameCondition=DEMO_INIT;
  1023.         if( TPALET0!=0 ){ TPALET0=0; }
  1024.     }
  1025. //    exit_flag=TRUE;
  1026.  
  1027.     return(0);
  1028. }
  1029.  
  1030.  
  1031.  
  1032.  
  1033. int    StepMan()
  1034. {
  1035.     switch( gameCondition ){
  1036.         case ALL_INIT:        SM__ALL_INIT();            break;
  1037.  
  1038.         case DEMO_INIT:        SM__DEMO_INIT();        break;
  1039.         case DEMO:        SM__DEMO();            break;
  1040.  
  1041.         case COUNTDOWN_INIT:    SM__COUNTDOWN_INIT();        break;
  1042.         case COUNTDOWN:        SM__COUNTDOWN();        break;
  1043.  
  1044.         case PLAY_TRACK:    SM__PLAY_TRACK();        break;
  1045.         case WAIT_ANSWER:    SM__WAIT_ANSWER();        break;
  1046.  
  1047.         case GOOD_ANSWER_INIT:    SM__GOOD_ANSWER_INIT();        break;
  1048.         case GOOD_ANSWER:    SM__GOOD_ANSWER();        break;
  1049.         case BAD_ANSWER_INIT:    SM__BAD_ANSWER_INIT();        break;
  1050.         case BAD_ANSWER:    SM__BAD_ANSWER();        break;
  1051.         case TIMEOUT_ANSWER_INIT:SM__TIMEOUT_ANSWER_INIT();    break;
  1052.         case TIMEOUT_ANSWER:    SM__TIMEOUT_ANSWER();        break;
  1053.         case WAIT_NEXT:        SM__WAIT_NEXT();        break;
  1054.  
  1055.         case LEVEL_CONTROL:    SM__LEVEL_CONTROL();        break;
  1056.  
  1057.         case GAMEOVER_INIT:    SM__GAMEOVER_INIT();        break;
  1058.         case GAMEOVER:        SM__GAMEOVER();            break;
  1059.     }
  1060.  
  1061.     return(0);
  1062. }
  1063.  
  1064.  
  1065.  
  1066.  
  1067. int    main(argc,argv)
  1068. int    argc;
  1069. char    *argv[];
  1070. {
  1071.     int    res;
  1072.     int    tm=0;
  1073.     char    *mes[2]={
  1074.         "終了しました",
  1075.         "CD-ROMの準備等が出来ていないようです"
  1076.     };
  1077.  
  1078.     res=Init(argc,argv);
  1079.     if( res<0 ){
  1080.         tm=1;
  1081.         goto quick_exit;
  1082.     }
  1083.  
  1084.     while( exit_flag!=TRUE ){
  1085.         StepMan();
  1086.         DevMan();
  1087.         Idle();
  1088.         SyncMan();
  1089.     }
  1090.  
  1091. quick_exit:
  1092.     Term(mes[tm]);
  1093.     return(0);
  1094. }
  1095.  
  1096.  
  1097.  
  1098. /* [ EOF ] */
  1099.  
  1100.  
  1101.  
  1102.  
  1103.  
  1104.